// 题目描述
// 54. 螺旋矩阵
// 提示
// 中等
// 1.5K
// 给你一个 m 行 n 列的矩阵 matrix ，请按照 顺时针螺旋顺序 ，返回矩阵中的所有元素。
//   示例 1：
// 输入：matrix = [[1,2,3],[4,5,6],[7,8,9]]
// 输出：[1,2,3,6,9,8,7,4,5]
// 示例 2：
// 输入：matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
// 输出：[1,2,3,4,8,12,11,10,9,5,6,7]
//   提示：
// m == matrix.length
// n == matrix[i].length
// 1 <= m, n <= 10
// -100 <= matrix[i][j] <= 100
// 通过次数
// 403.6K
// 提交次数
// 813.6K
// 通过率
// 49.6%
// https://leetcode.cn/problems/spiral-matrix

/**
 * 顺时针遍历矩阵
 * @param {number[][]} matrix
 * @return {number[]}
 */
var spiralOrder = function (matrix) {
  if (!matrix.length || !matrix[0].length) {
    return []
  }

  const res = []
  const rows = matrix.length
  const cols = matrix[0].length

  /**
   * lt rt
   * lb rb
   */
  let [left, right, top, bottom] = [0, cols - 1, 0, rows - 1]
  while (left <= right && top <= bottom) {
    // 上面一行
    for (let i = left; i <= right; i++) {
      res.push(matrix[top][i])
    }
    // 右面一列
    for (let i = top + 1; i <= bottom; i++) {
      res.push(matrix[i][right])
    }

    if (left < right && top < bottom) {
      for (let i = right - 1; i > left; --i) {
        res.push(matrix[bottom][i])
      }
      for (let i = bottom; i > top; --i) {
        res.push(matrix[i][left])
      }
    }

    // shrink
    ;[left, right, top, bottom] = [left + 1, right - 1, top + 1, bottom - 1]
  }

  return res
}

console.log(
  spiralOrder(
    [[1,2,3],[4,5,6],[7,8,9]]
  )
)
